why do we need generics in c